package com.kuang.blockqueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.TimeUnit;

/**
 * 同步队列
 *      和其他 BlockingQueue 不一样，SychronousQueue 不存储元素
 *      没有容量，进去一个元素，必须等待取出来之后，才能再往里放一个元素！
 *      put、take
 */
public class SynchronousQueueTest {
    public static void main(String[] args) {
        // 同步队列  SynchronousQueue mplements BlockingQueue
        //SynchronousQueue<Object> synchronousQueue = new SynchronousQueue<>();
        BlockingQueue<Object> synchronousQueue = new SynchronousQueue<>();

        new Thread(()->{
            try {
                System.out.println(Thread.currentThread().getName()+"put 1");
                synchronousQueue.put("1");
                System.out.println(Thread.currentThread().getName()+"put 2");
                synchronousQueue.put("2");
                System.out.println(Thread.currentThread().getName()+"put 3");
                synchronousQueue.put("3");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T1:").start();
        new Thread(()->{
            try {
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+synchronousQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+synchronousQueue.take());
                TimeUnit.SECONDS.sleep(3);
                System.out.println(Thread.currentThread().getName()+"=>"+synchronousQueue.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"T2:").start();
    }
    /*
        T1:put 1
        T2:=>1
        T1:put 2
        T2:=>2
        T1:put 3
        T2:=>3
     */
}
